home *** CD-ROM | disk | FTP | other *** search
/ Aminet 46 / Aminet 46 (2001)(GTI - Schatztruhe)[!][Dec 2001].iso / Aminet / text / edit / edt10src.lha / txt / EArgs.mod < prev    next >
Text File  |  1995-04-08  |  3KB  |  151 lines

  1. (*
  2.   .name       EArgs
  3.   .task       Argument/Tooltype parsing
  4.   .release    1.0
  5.   .language   Oberon-2
  6.   .translator Amiga Oberon 3.11
  7.   .system     AmigaOS 2.04/2.1/3.0
  8.   .author     Joachim Barheine
  9.   .address    Hochgrevestraße 3, D-38640 Goslar
  10.   .copyright  (c) 1994 by Joachim Barheine
  11. *)
  12.  
  13. (* .info: 30/04/94, 14:19:58, version 11 *)
  14.  
  15. MODULE EArgs;
  16.  
  17. IMPORT
  18.   Exec,
  19.   Dos,
  20.   Icon,
  21.   K:= Kernel,
  22.   OLib:= OberonLib,
  23.   Util:= Utility,
  24.   Wb:= Workbench;
  25.  
  26. CONST
  27.   template = "FROM/M,WITH/K,PUBSCREEN/K";
  28. (* $IF M2Amiga THEN *)
  29.   defEdtName = "M2Edt";
  30. (* $ELSE *)
  31.   defEdtName = "Edt";
  32. (* $END *)
  33.  
  34. VAR
  35.   old, currDir: Dos.FileLockPtr;
  36.   wbMsg: Wb.WBStartupPtr;
  37.   rdArgs: Dos.RDArgsPtr;
  38.   args  : STRUCT (dummy: Dos.ArgsStruct)
  39.             from: Dos.ArgStringArray;
  40.             startup: Dos.ArgString;
  41.             pubScreen: Dos.ArgString;
  42.           END;
  43.   from- : ARRAY 256 OF Exec.STRPTR;
  44.   pubScreen- : Exec.STRING;  (* name of public screen *)
  45.   startup- : Exec.STRING;  (* name of startup file *)
  46.   edt- : Exec.STRING;  (* filename of Edt *)
  47.   numArgs- : INTEGER;
  48.  
  49. PROCEDURE WBGetFilename* (VAR filename: ARRAY OF CHAR; dir: Dos.FileLockPtr; name: Exec.LSTRPTR): BOOLEAN;
  50.  
  51. VAR
  52.   oldCurr, lock: Dos.FileLockPtr;
  53.  
  54. (* $CopyArrays- *)
  55.  
  56. BEGIN
  57.   oldCurr:= Dos.CurrentDir(dir);
  58.   lock:= Dos.Lock(name^, Dos.sharedLock);
  59.   IF lock # NIL THEN
  60.     IF ~Dos.NameFromLock(lock, filename, LEN(filename)) THEN
  61.       filename:= "";
  62.     END;
  63.     Dos.UnLock(lock);
  64.   END;
  65.   dir:= Dos.CurrentDir(oldCurr);
  66.   RETURN filename # "";
  67. END WBGetFilename;
  68.  
  69. PROCEDURE WBParseArgs;
  70.  
  71. VAR
  72.   i, fi: INTEGER;
  73.   diskObj: Wb.DiskObjectPtr;
  74.   s: Exec.LSTRPTR;
  75.  
  76. BEGIN
  77.   fi:= 0;
  78.   FOR i:= 1 TO SHORT(wbMsg.numArgs) - 1 DO
  79.     NEW(from[fi]);
  80.     IF WBGetFilename(from[fi]^, wbMsg.argList[i].lock, wbMsg.argList[i].name) THEN
  81.       INC(fi);
  82.     ELSE
  83.       DISPOSE(from[fi]);
  84.     END;
  85.   END;
  86.   from[fi]:= NIL;
  87.   numArgs:= fi;
  88.  
  89.   diskObj:= Icon.GetDiskObject(edt);
  90.   IF diskObj # NIL THEN
  91.     s:= Icon.FindToolType(diskObj.toolTypes, "PUBSCREEN");
  92.     IF s # NIL THEN COPY(s^, pubScreen) END;
  93.     s:= Icon.FindToolType(diskObj.toolTypes, "WITH");
  94.     IF s # NIL THEN COPY(s^, startup) END;
  95.     Icon.FreeDiskObject(diskObj);
  96.   END;
  97. END WBParseArgs;
  98.  
  99. PROCEDURE CLIParseArgs;
  100.  
  101. VAR
  102.   i, fi: INTEGER;
  103.   lock: Dos.FileLockPtr;
  104.  
  105. BEGIN
  106.   i:= 0; fi:= 0;
  107.   IF args.from # NIL THEN
  108.     REPEAT
  109.       lock:= Dos.Lock(args.from[i]^, Dos.sharedLock);
  110.       IF lock # NIL THEN
  111.         NEW(from[fi]);
  112.         IF Dos.NameFromLock(lock, from[fi]^, SIZE(from[fi]^)) THEN
  113.           INC(fi);
  114.         ELSE
  115.           DISPOSE(from[fi]);
  116.         END;
  117.         Dos.UnLock(lock);
  118.       END;
  119.       INC(i);
  120.     UNTIL args.from[i] = NIL;
  121.   END;
  122.   from[fi]:= NIL;
  123.   numArgs:= fi;
  124.   IF args.pubScreen # NIL THEN COPY(args.pubScreen^, pubScreen) END;
  125.   IF args.startup # NIL THEN COPY(args.startup^, startup) END;
  126. END CLIParseArgs;
  127.  
  128. BEGIN
  129.   old:= NIL;
  130.   rdArgs:= NIL;
  131.   numArgs:= 0;
  132.   from[0]:= NIL;
  133.   startup:= "";
  134.   pubScreen:= "";
  135.   IF OLib.wbStarted THEN
  136.     wbMsg:= OLib.wbenchMsg;
  137.     currDir:= wbMsg.argList[0].lock;
  138.     old:= Dos.CurrentDir(currDir);
  139.     IF ~WBGetFilename(edt, currDir, wbMsg.argList[0].name) THEN edt:= defEdtName END;
  140.     WBParseArgs;
  141.   ELSE
  142.     IF ~Dos.GetProgramName(edt, SIZE(edt)) THEN edt:= defEdtName END;
  143.     rdArgs:= Dos.ReadArgs(template, args, NIL);
  144.     IF rdArgs # NIL THEN
  145.       CLIParseArgs;
  146.       Dos.FreeArgs(rdArgs);
  147.     END;
  148.   END;
  149. CLOSE
  150.   IF old # NIL THEN currDir:= Dos.CurrentDir(old) END;
  151. END EArgs.